<?php
class User_permisos extends MY_Controller {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'User_permiso');

    	$this->title = 'Usuarios :: Permisos';
		$this->CARPETA_VISTAS = 'usuarios/';
		$this->nombre_entidad = 'Permiso';
		$this->nombre_entidad_plural = $this->nombre_entidad . 's';

		$this->pagina_ver = $this->CARPETA_VISTAS . 'permiso_ver_todos_view';
		$this->pagina_editar = $this->CARPETA_VISTAS . 'permiso_edit_view';
		$this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'permiso_filtros_ver_todos_view';

		$this->exportarExcelPermitido = FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Devuelve un arreglo que contiene el objeto de la entidad correspondiente, poblado con la información obtenida a 
	 * partir del formulario recibido a través de POST, y los objetos de otro tipo asociados al mismo.	*/
	protected function getObjetoDesdeForm()
	{
		$id_permiso = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		$obj_permiso = $this->getObjeto($id_permiso);
		
		$datos['objEntidad'] = $obj_permiso;

		// Obtengo el Rol al que se le desean asociar los formularios
		$id_rol = is_numeric($this->input->post('sel_rol')) ? $this->input->post('sel_rol') : NULL;
		$datos['objRol'] = new User_rol($id_rol);

		$formularios = array();
		foreach ($this->input->post('sel_formulario') as $form) {
			$objForm = new User_formulario($form);
			$formularios[] = $objForm;
		}
		$datos['formularios'] = $formularios;

		$datos['objRelacionados'] = array();

		return $datos;
	}

	public function editar($id_rol = NULL)
	{
		// La edición de permisos se hace por ROL
		$dataView['objEntidad'] = $this->getObjeto();
		$dataView['id_rol'] = $id_rol;

		$this->_cargarFormEdicion($dataView);
	}


	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
		$id_rol = isset($dataView['id_rol']) ? $dataView['id_rol'] : 0;

		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_rol = new User_rol($id_rol);

		$opcionesSel = array();
		if($id_rol != NULL && $id_rol != 0) {
			$dataView['listado_roles'] = $obj_rol;

			$obj_permiso = new User_permiso();
			$obj_permiso->where('user_rol_id', $id_rol);
			foreach ($obj_permiso->get_iterated() as $perm) {
				$opcionesSel[] = $perm->user_formulario_id;
			}
		}
		else $dataView['listado_roles'] = $obj_rol->get_iterated();
		$dataView['opcionesSel'] = $opcionesSel;

		// Utilizado para el filtrado
		$obj_menu = new User_menu();
		$dataView['listado_menues'] = $obj_menu->get_iterated();

		$obj_form = new User_formulario();
		$dataView['listado_formularios'] = $obj_form->get_iterated();

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$id_rol = trim($this->input->post('f_sel_rol'));
		if($id_rol != 0) { 
			$objEntidad->like('user_rol_id', $id_rol); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Rol ';
		}

		$id_menu = trim($this->input->post('f_sel_menu'));
		if($id_menu != 0) { 
			$objEntidad->where_related_user_formulario('user_menu_id', $id_menu); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Menú ';
		}

		$dataView['id_rol'] = $id_rol;
		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	public function guardar()
	{
		$datos = $this->getObjetoDesdeForm();
		$objRol = $datos['objRol'];

		// Antes de crear los permisos, borro todos los que hubiera habido antes
		$objEntidad = $this->getObjeto();
		$objEntidad->where('user_rol_id', $objRol->id)->get();
		$error = parent::eliminarTodos($objEntidad);

		if(empty($error)) {
			$formularios = $datos['formularios'];
			foreach ($formularios as $form) {
				$dataView['objEntidad'] = $this->getObjeto();
				$dataView['objRelacionados'] = array($objRol, $form);
				
				$dataView = $this->guardarEntidad($dataView);
				if(!empty($dataView['error'])) $error .= $dataView['error'];
			}

			if(!empty($error)) {
				// Falló el intento de guardar
				$dataView['error'] = $error;
				$this->_cargarFormEdicion($dataView, TRUE); 
			}
			else { 
				// Utilizo el error únicamente para notificar algo
				$dataView['error'] = 'Los cambios realizados se verán reflejados en el próximo inicio de sesión.';
				$this->ver_todos(); 
			}
		}
		else {
			$dataView['error'] = 'Ocurrió un error al intentar eliminar los permisos iniciales.';
			$this->ver_todos($dataView);
		}
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		// No se permite la eliminación de usuarios
		return FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		$obj_usuario = $this->getObjeto($id_elemento);

		if(($obj_usuario->id != NULL && $obj_usuario->editable) || $obj_usuario->id == NULL) return TRUE;
		else return FALSE;
	}

	protected function setAyuda($dataView) {
		$dataView['ayuda_objetivo'] = 'Visualizar y establecer para cada rol, los permisos de acceso a las funcionalidades del sistema.';
		$dataView['descripcion_breve'] = 'Según el rol que tiene un usuario en el sistema, éste podrá hacer uso de ciertas secciones del sistema según los permisos que le sen asignados, 
										    aumentando el control sobre las actividades que pueden ser desarrolladas por el mismo.</br>
										    Los permisos definen las acciones o privilegios que tendrán cada uno de los usuarios de un determinado rol en el sistema. De esta manera, 
										    en lugar de asignar permisos a cada usuario en particular, se asignan a un rol determinado y todos los usuarios que pertenezcan a dicha 
										    categorización tendrán los permisos correspondientes.
										    Cada permiso define qué Rol puede acceder a qué Formulario del sistema.';
		
		$dataView['ayuda_edicionPosible'] = 'Para realizar la edición de los permisos de un rol, primero debe realizarse el filtro por ROL en la Sección Búsqueda.';
		$dataView['ayuda_explicación_adicional'] = 'Todos los cambios realizados requieren que el usuario vuelva a loguearse al sistema para verse reflejados.';
		$dataView['ayuda_adicional'] = 'Tanto al crear permisos nuevos para un rol como al editar los existentes, se deben SELECCIONAR SIMULTÁNEAMENTE todos los formularios a los que tendrá acceso el ROL particular elegido.';

		return $dataView;
	}
}